/**
 * 将嵌套对象扁平化为单层对象
 * @description 将多层嵌套的对象转换为单层对象，使用点号（.）作为分隔符表示层级关系
 * @param {Object} obj - 需要扁平化的对象
 * @returns {Object} 扁平化后的对象
 * @example
 * const nested = {
 *   name: 'zs',
 *   age: 12,
 *   info: {
 *     likes: {
 *       fruit: 'apple'
 *     }
 *   }
 * };
 *
 * flattenObject(nested);
 * // 返回:
 * // {
 * //   'name': 'zs',
 * //   'age': 12,
 * //   'info.likes.fruit': 'apple'
 * // }
 */
const flattenObject = (obj) => {
    const result = {};
    function flatten(current, prefix = '') {
        // 如果是 null 或 undefined，直接返回
        if (current == null) {
            result[prefix] = current;
            return;
        }
        // 如果是对象但不是数组
        if (typeof current === 'object' && !Array.isArray(current)) {
            // 遍历对象的所有可枚举属性
            Object.keys(current).forEach(key => {
                const newPrefix = prefix ? `${prefix}.${key}` : key;
                flatten(current[key], newPrefix);
            });
            return;
        }
        // 其他情况（包括数组和基本类型）直接赋值
        if (prefix) {
            result[prefix] = current;
        }
    }
    flatten(obj);
    return result;
};

export { flattenObject };
